// #include <pthread.h>
// #include <iostream>
// #include <functional>
// #include <memory>
// #include <unistd.h>
// #include <string>
// using namespace std;
// using func_t=function<string(string)>;//typedef类型重定义
// void* Func1(void* arg)
// {
//     const char* str=static_cast<const char*>(arg);//强转一下arg
//     int count=5;//添加一个计数器来终止掉进程线程p1
//     while(1)
//     {
//         if(count==0)//等到count为0时终止p1线程
//         {
//             pthread_exit(nullptr);
//         }
//         count--;
//     cout<<str<<"count:"<<count<<endl;
//     sleep(1);
//     }
// }

// void* Func2(void* arg)
// {

//     // int count=5;
//     while(1)
//     {
//     const char* str=static_cast<const char*>(arg);
//     cout<<str<<endl;
//     sleep(1);
//     }
// }
// int main()
// {

//     // cout<<pthread_self()<<endl;
//     char* str1="hello,I am p1";
//     char* str2="hello,I am p2";
//      pthread_t  p1,p2;//线程名
//     pthread_create(&p1,nullptr,Func1,str1);
//     pthread_create(&p2,nullptr,Func2,str2);
//     //cout<<"It is the time to wait p2"<<endl;
//     //pthread_join(p2,nullptr);//等待p2线程结束
//     //cout<<"join end!!!"<<endl;//只有等等待完p2才会执行

//     while(1)
//     {
//     cout<<"I am a main thread，count:"<<endl;
//     sleep(1);
//     }
//     return 0;
// }

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
int ticket = 100;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//使用锁
void *route(void *arg)
{
    char *id = (char *)arg;
    while (1)
    {
        pthread_mutex_lock(&mutex);//上锁
        if (ticket > 0)
        {
            usleep(1000);
            printf("%s sells ticket:%d\n", id, ticket);
            ticket--;
        pthread_mutex_unlock(&mutex);//解锁
        }
        else
        {
        pthread_mutex_unlock(&mutex);
        //这里也需要，因为假设有线程正好碰到ticket为0了,而它后面还有线程，那就需要解锁，让后面的线程进入临界区，不能一直挂起着
        break;
        }
    }
}
int main(void)
{
    pthread_t t1, t2, t3, t4;
    pthread_create(&t1, NULL, route,(char*)"thread 1");
    pthread_create(&t2, NULL, route,(char*)"thread 2");
    pthread_create(&t3, NULL, route,(char*)"thread 3");
    pthread_create(&t4, NULL, route,(char*)"thread 4");
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_join(t3, NULL);
    pthread_join(t4, NULL);
    pthread_mutex_destroy(&mutex);
}